home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Extensions / Imaging / PIL / FliImagePlugin.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.8 KB  |  139 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: FliImagePlugin.py,v 1.1.1.1 1998/08/18 13:07:51 sjoerd Exp $
  4. #
  5. # FLI/FLC file handling.
  6. #
  7. # History:
  8. #    95-09-01 fl    Created
  9. #    97-01-03 fl    Fixed parser, setup decoder tile
  10. #    98-07-15 fl    Renamed offset attribute to avoid name clash
  11. #
  12. # Copyright (c) Secret Labs AB 1997-98.
  13. # Copyright (c) Fredrik Lundh 1995-97.
  14. #
  15. # See the README file for information on usage and redistribution.
  16. #
  17.  
  18.  
  19. __version__ = "0.2"
  20.  
  21. import Image, ImageFile, ImagePalette
  22. import string
  23.  
  24.  
  25. def i16(c):
  26.     return ord(c[0]) + (ord(c[1])<<8)
  27.  
  28. def i32(c):
  29.     return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) + (ord(c[3])<<24)
  30.  
  31. #
  32. # decoder
  33.  
  34. def _accept(prefix):
  35.     return i16(prefix[4:6]) in [0xAF11, 0xAF12]
  36.  
  37. class FliImageFile(ImageFile.ImageFile):
  38.  
  39.     format = "FLI"
  40.     format_description = "Autodesk FLI/FLC Animation"
  41.  
  42.     def _open(self):
  43.  
  44.     # HEAD
  45.     s = self.fp.read(128)
  46.     magic = i16(s[4:6])
  47.     if magic not in [0xAF11, 0xAF12]:
  48.         raise SyntaxError, "not an FLI/FLC file"
  49.  
  50.     # image characteristics
  51.     self.mode = "P"
  52.     self.size = i16(s[8:10]), i16(s[10:12]) 
  53.  
  54.     # animation speed
  55.     duration = i32(s[16:20])
  56.     if magic == 0xAF11:
  57.         duration = (duration * 1000) / 70 
  58.     self.info["duration"] = duration
  59.  
  60.     # look for palette
  61.     palette = map(lambda a: (a,a,a), range(256))
  62.  
  63.     s = self.fp.read(16)
  64.  
  65.     self.__offset = 128
  66.  
  67.     if i16(s[4:6]) == 0xF100:
  68.         # prefix chunk; ignore it
  69.         self.__offset = self.__offset + i32(s)
  70.         s = self.fp.read(16)
  71.  
  72.     if i16(s[4:6]) == 0xF1FA:
  73.         # look for palette chunk
  74.         s = self.fp.read(6)
  75.         if i16(s[4:6]) == 11:
  76.         self._palette(palette, 2)
  77.         elif i16(s[4:6]) == 4:
  78.         self._palette(palette, 0)
  79.  
  80.     palette = map(lambda (r,g,b): chr(r)+chr(g)+chr(b), palette)
  81.     self.palette = ImagePalette.raw("RGB", string.join(palette, ""))
  82.  
  83.     # set things up to decode first frame
  84.     self.frame = -1
  85.     self.__fp = self.fp
  86.  
  87.     self.seek(0)
  88.  
  89.     def _palette(self, palette, shift):
  90.     # load palette
  91.  
  92.     i = 0
  93.     for e in range(i16(self.fp.read(2))):
  94.         s = self.fp.read(2)
  95.         i = i + ord(s[0])
  96.         n = ord(s[1])
  97.         if n == 0:
  98.         n = 256
  99.         s = self.fp.read(n * 3)
  100.         for n in range(0, len(s), 3):
  101.         r = ord(s[n]) << shift
  102.         g = ord(s[n+1]) << shift
  103.         b = ord(s[n+2]) << shift
  104.         palette[i] = (r, g, b)
  105.         i = i + 1
  106.  
  107.     def seek(self, frame):
  108.  
  109.     if frame != self.frame + 1:
  110.         raise ValueError, "cannot seek to frame %d" % frame
  111.     self.frame = frame
  112.  
  113.     # move to next frame
  114.     self.fp = self.__fp
  115.     self.fp.seek(self.__offset)
  116.  
  117.     s = self.fp.read(4)
  118.     if not s:
  119.         raise EOFError
  120.  
  121.     framesize = i32(s)
  122.  
  123.     self.decodermaxblock = framesize
  124.     self.tile = [("fli", (0,0)+self.size, self.__offset, None)]
  125.  
  126.     self.__offset = self.__offset + framesize
  127.  
  128.     def tell(self):
  129.  
  130.     return self.frame
  131.  
  132. #
  133. # registry
  134.  
  135. Image.register_open("FLI", FliImageFile, _accept)
  136.  
  137. Image.register_extension("FLI", ".fli")
  138. Image.register_extension("FLI", ".flc")
  139.